"""
响应数据提取工具类
"""
import json

from jsonpath import jsonpath
from loguru import logger

from api_test_framework.data.envi_data import EnviData


def extract_response_to_env(response, extract_data: str):
    """
    从响应中提取数据并设置到环境变量
    :param response: 响应对象
    :param extract_data: 提取表达式,格式如:{"token": "$.data.token"}
    """
    if extract_data is None:
        logger.info("没有从响应结果里要提取的数据！")
        return None

    # 入参数据预处理，response是响应消息的对象，转化为json格式；extract_data是字符串，转化为字典
    extract_data = json.loads(extract_data) if isinstance(extract_data, str) else extract_data

    # 遍历要提取的数据字典，分别提取数据并存储到环境变量中
    logger.info(f"提取数据的表达式是：{extract_data}")
    for extract_k, extract_v in extract_data.items():
        extracted_value = None
        if extract_v.startswith("$"):
            extracted_value = jsonpath(response.json(), extract_v)[0]
            setattr(EnviData, extract_k, extracted_value)
        elif extract_v == "text":
            extracted_value = response.text
            setattr(EnviData, extract_k, extracted_value)
        logger.info(f"提取出去的数据是：{extracted_value}")
    logger.info(f"提取并设置环境变量后的类属性为：{EnviData.__dict__}")

